package com.itcam.project.controller;

import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Profile;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * @author : Cammy.Wu
 * Description : 队列测试——线程池
 */

@RestController
@RequestMapping("/queue")
@Profile({"dev", "local"})
@Slf4j
public class QueueController {

    @Resource
    private ThreadPoolExecutor threadPoolExecutor;

    /**
     * 向线程池添加一个异步任务
     *
     * @param name 任务的名称
     */
    @GetMapping("/add")
    public void add(String name) {
        // 使用 CompletableFuture 运行一个异步任务
        CompletableFuture.runAsync(() -> {
            // 记录日志，输出正在执行的任务名称和执行线程的名称
            log.info("任务执行中：" + name + ",执行人：" + Thread.currentThread().getName());
            try {
                // 让当前线程休眠 600000 毫秒（即 10 分钟），模拟任务执行时间
                Thread.sleep(600000);
            } catch (InterruptedException e) {
                // 若线程在休眠过程中被中断，打印异常堆栈信息
                e.printStackTrace();
            }
            // 异步任务在 threadPoolExecutor 中执行
        }, threadPoolExecutor);
    }


    /**
     * 获取线程池状态的接口
     *
     * @return 包含线程池状态信息的 JSON 字符串
     */
    @GetMapping("/get")
    public String get() {
        // 创建一个 HashMap 用于存储线程池的状态信息
        Map<String, Object> map = new HashMap<>();
        // 获取线程池任务队列的长度
        int size = threadPoolExecutor.getQueue().size();
        // 获取线程池接收到的任务总数
        long taskCount = threadPoolExecutor.getTaskCount();
        // 获取线程池已完成的任务数量
        long completedTaskCount = threadPoolExecutor.getCompletedTaskCount();
        // 获取线程池中正在执行任务的线程数量
        int activeCount = threadPoolExecutor.getActiveCount();

        // 将队列长度信息存入 map
        map.put("队列长度", size);
        // 将任务总数信息存入 map
        map.put("任务总数", taskCount);
        // 将已完成的任务数信息存入 map
        map.put("已完成的任务数", completedTaskCount);
        // 将正在工作的线程数信息存入 map
        map.put("正在工作的线程数", activeCount);

        // 将存储线程池状态信息的 map 转换为 JSON 字符串并返回
        return JSONUtil.toJsonStr(map);
    }

}


